package com.itcam.imitate;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

// 魔法书的实践者（主类）
public class ReflectionStory {
    public static void main(String[] args) throws Exception {
        System.out.println("===== 第一章：获取机器人的灵魂 =====");
        // 魔法咒语：通过类全名获取 Class 对象
        Class<?> robotClass = Class.forName("Robot");
        System.out.println("找到灵魂：" + robotClass.getSimpleName());

        System.out.println("\n===== 第二章：破解能源核心 =====");
        Robot robot = new Robot();
        // 获取私有字段并修改
        Field energyField = robotClass.getDeclaredField("energyCore");
        energyField.setAccessible(true); // 强制访问
        System.out.println("原始能量：" + energyField.get(robot));
        energyField.set(robot, 9999);    // 注入新能量
        System.out.println("新能量：" + energyField.get(robot));

        System.out.println("\n===== 第三章：激活火箭发射 =====");
        // 获取私有方法并调用
        Method launchMethod = robotClass.getDeclaredMethod("launchRocket", String.class);
        launchMethod.setAccessible(true); // 解除私有限制
        launchMethod.invoke(robot, "北京"); // 传入参数

        System.out.println("\n===== 第四章：无中生有造机器人 =====");
        // 通过反射创建实例
        Constructor<?> constructor = robotClass.getConstructor();
        Robot newRobot = (Robot) constructor.newInstance();
        newRobot.sayHello();
    }
}

// 机器人蓝图（类定义）
class Robot {
    // 私有字段：隐藏的能源核心
    private int energyCore = 100;

    // 公共构造方法
    public Robot() {
        System.out.println("[机器人出厂] 新机器人已激活！");
    }

    // 公共方法
    public void sayHello() {
        System.out.println("你好，我是机器人！");
    }

    // 私有方法：秘密技能
    private void launchRocket(String target) {
        System.out.println("🚀 火箭发射目标锁定：" + target + "！");
    }
}